{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pylab \n",
    "from scipy.optimize import curve_fit\n",
    "from numba import njit\n",
    "from scipy.misc import derivative\n",
    "\n",
    "np.random.seed(17)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_f(x, funcs):\n",
    "    \n",
    "    if not isinstance(funcs, list):\n",
    "        funcs = [funcs]\n",
    "\n",
    "    for func in funcs:\n",
    "        pylab.plot(x, func(x), label=func.__name__)\n",
    "    pylab.legend(loc='upper left')\n",
    "    pylab.grid(True)\n",
    "    pylab.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_act(func, popt):\n",
    "    def f(x):\n",
    "        return func(x, *popt)\n",
    "        \n",
    "    return f"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def softplus(x):\n",
    "    return np.log(1+np.exp(x))\n",
    "\n",
    "def relu(x):\n",
    "    return np.clip(x, a_min=0, a_max=None)\n",
    "\n",
    "def relu6(x):\n",
    "    return np.clip(x, a_min=0, a_max=6)\n",
    "\n",
    "def leakyrelu(x):\n",
    "    res = np.array(x)\n",
    "    neg_x_idx = x < 0\n",
    "    res[neg_x_idx] = 0.01*x[neg_x_idx]\n",
    "    return res\n",
    "\n",
    "def get_leaky_relu(alpha):\n",
    "    def LR(x):\n",
    "        res = np.array(x)\n",
    "        neg_x_idx = x < 0\n",
    "        res[neg_x_idx] = alpha*x[neg_x_idx]\n",
    "        return res\n",
    "    LR.alpha  = alpha\n",
    "    return LR\n",
    "\n",
    "def elu(x, alpha=1.0):\n",
    "    res = np.array(x)\n",
    "    neg_x_idx = x <= 0\n",
    "    x = x[neg_x_idx]\n",
    "    res[neg_x_idx] = alpha*(np.exp(x)-1)\n",
    "    return res\n",
    "\n",
    "def celu(x, alpha=1.0):\n",
    "    res = np.array(x)\n",
    "    neg_x_idx = x < 0\n",
    "    x = x[neg_x_idx]\n",
    "    res[neg_x_idx] = alpha*(np.exp(x/alpha)-1)\n",
    "    return res\n",
    "\n",
    "def selu(x, alpha=1.6732632423543772848170429916717, scale=1.0507009873554804934193349852946):\n",
    "    res = np.array(x)\n",
    "    neg_x_idx = x < 0\n",
    "    x = x[neg_x_idx]\n",
    "    res[neg_x_idx] = alpha*(np.exp(x)-1)\n",
    "    return scale*res\n",
    "\n",
    "def tanh(x):\n",
    "    return np.tanh(x)\n",
    "\n",
    "def sigmoid(x):\n",
    "    return 1.0 / (1.0 + np.exp(-x))\n",
    "\n",
    "def swish(x):\n",
    "    return x * (1.0 / (1.0 + np.exp(-x)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "@njit\n",
    "def ratio_func54(x, w0,w1,w2,w3,w4, w5, d1, d2, d3, d4):\n",
    "    c1 = 0\n",
    "    xp = (x-c1)\n",
    "    xp1 = xp\n",
    "    xp2 = xp1*xp\n",
    "    xp3 = xp2*xp\n",
    "    xp4 = xp3*xp\n",
    "    xp5 = xp4*xp\n",
    "    \n",
    "    P = w0  + w1*xp1 + w2*xp2 + w3*xp3 + w4*xp4 + w5*xp5\n",
    "    Q = 1.0 + d1*xp1 + d2*xp2 + d3*xp3 + d4*xp4\n",
    "    return P/Q\n",
    "\n",
    "@njit\n",
    "def ratio_func_abs54(x, w0,w1,w2,w3,w4, w5, d1, d2, d3, d4):\n",
    "    c1 = 0\n",
    "    xp = (x-c1)\n",
    "    xp1 = xp\n",
    "    xp2 = xp1*xp\n",
    "    xp3 = xp2*xp\n",
    "    xp4 = xp3*xp\n",
    "    xp5 = xp4*xp\n",
    "    \n",
    "    P = w0  + w1*xp1 + w2*xp2 + w3*xp3 + w4*xp4 + w5*xp5\n",
    "    Q = 1.0 + np.abs(d1)* np.abs(xp1) +  np.abs(d2)* np.abs(xp2) +  np.abs(d3)* np.abs(xp3) +  np.abs(d4)* np.abs(xp4)\n",
    "    return P/Q"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def fit_func(func, ref_func, x, p0=None, maxfev=10000000, bounds=None):\n",
    "    y = ref_func(x)\n",
    "    popt, _ = curve_fit(func, x, y,  p0=p0, maxfev=maxfev,  bounds=bounds)\n",
    "    #print(popt)\n",
    "    return popt, get_act(func, popt)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "lr000 = get_leaky_relu(0.0)\n",
    "lr001 = get_leaky_relu(0.01)\n",
    "lr025 = get_leaky_relu(0.25)\n",
    "lr030 = get_leaky_relu(0.30)\n",
    "lr020 = get_leaky_relu(0.20)\n",
    "lrm050 = get_leaky_relu(-0.50)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "ename": "AttributeError",
     "evalue": "'function' object has no attribute 'alpha'",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mAttributeError\u001b[0m                            Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-19-8aeefa7aab8a>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      4\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mlrf\u001b[0m \u001b[0;32min\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mrelu6\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      5\u001b[0m     \u001b[0mpopt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mact_f\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfit_func\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mratio_func_abs54\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlrf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbounds\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 6\u001b[0;31m     \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlrf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0malpha\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpopt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtolist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      7\u001b[0m     \u001b[0mresult\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mpopt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mact_f\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      8\u001b[0m     \u001b[0mplot_f\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0marange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m5\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m0.00001\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mact_f\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlrf\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mAttributeError\u001b[0m: 'function' object has no attribute 'alpha'"
     ]
    }
   ],
   "source": [
    "x = np.arange(-3,3,0.000001)\n",
    "\n",
    "result = []\n",
    "for lrf in [lr000]:\n",
    "    popt, act_f = fit_func(ratio_func_abs54, lrf, x, bounds=(-np.inf, np.inf))\n",
    "    print(lrf.alpha, popt.tolist())\n",
    "    result.append([popt, act_f])\n",
    "    plot_f(np.arange(-5,5,0.00001), [act_f, lrf])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "relu6 [0.08470411911913851, 7.2703258907789134, 35.432966095955315, 27.292038507781328, 5.915954747353017, 0.367177096063688, -76.1487917509066, 15.092549664549832, 4.6056485484840056e-08, 1.7520767761450022]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x = np.arange(-10,10,0.000001)\n",
    "\n",
    "\n",
    "popt, act_f = fit_func(ratio_func_abs54, relu6, x, bounds=(-np.inf, np.inf))\n",
    "print('relu6', popt.tolist())\n",
    "plot_f(np.arange(-7,7,0.00001), [act_f, relu6])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "popt_sigmoid = [1/2, 1/4, 1/18, 1/144, 1/2016, 1/60480, 0, 1/9, 0, 1/1000]\n",
    "popt_tanh = [1/2, 1/4, 1/18, 1/144, 1/2016, 1/60480, 0, 1/9, 0, 1/1000]\n",
    "popt_swish = [1/2, 1/4, 1/18, 1/144, 1/2016, 1/60480, 0, 1/9, 0, 1/1000]\n",
    "popt_lrelu0_01 = [0.02979246288832245, 0.6183773789612337, 2.3233520651936534, 3.0520265972657823, 1.4854800152744463, 0.251037168372827, -1.1420122633346115, 4.393228341365807, 0.8715444974667658, 0.34720651643419215]\n",
    "popt_lrelu0_20 = [0.025577756009581332, 0.6618281545012629, 1.5818297539580468, 2.944787587381909, 0.9528779431354413, 0.23319680694163697, -0.5096260509947604, 4.183768902183391, 0.3783209020348012, 0.3240731442906416]\n",
    "popt_lrelu0_25 = [0.02423485464722387, 0.6770971779085044, 1.4385836314706064, 2.9549799006291724, 0.8567972159918334, 0.2322961171003388, -0.41014745814143555, 4.1469196374300115, 0.3029254642283438, 0.32002849530519256]\n",
    "popt_lrelu0_30 = [0.022823661027641513, 0.6935843817924783, 1.308474321805162, 2.976815988084191, 0.7716529650279255, 0.23252265245280854, -0.3284954321510746, 4.115579017543179, 0.2415560267417864, 0.31659365394646605]\n",
    "popt_lrelu0_50_neg =[0.026504409606513814, 0.8077291240826262, 13.566116392373088, 7.002178997009714, 11.614777812309141, 0.6872037476855452, -13.706489934094302, 6.077817327962073, 12.325352286416361, -0.540068802253311]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "popt = [0.022823661027641513, 0.6935843817924783, 1.308474321805162, 2.976815988084191, 0.7716529650279255, 0.23252265245280854, -0.3284954321510746, 4.115579017543179, 0.2415560267417864, 0.31659365394646605]\n",
    "act_f = get_act(ratio_func_abs54, popt_sigmoid)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_f(np.arange(-5,5,0.00001), [act_f])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "pytorch1_0",
   "language": "python",
   "name": "pytorch1_0"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
